home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
301-325
/
disk_302
/
turbomandel
/
source
/
turboasm.asm
< prev
next >
Wrap
Assembly Source File
|
1992-05-06
|
5KB
|
288 lines
***********************************
* TurboMandel Assembler Functions *
***********************************
CSECT data
XREF _GfxBase
XREF _MathTransBase
XREF _MathBase
XREF _CycleOn
XREF _CurrSpeed
XREF _CycleLeft
XREF _Palette
XREF _Manvp
XREF _CycleSpeed
XREF _toppos
CSECT text
XREF _LVOWaitTOF
XREF _LVOSPMul
XREF _LVOSPAdd
XREF _LVOSPSub
XREF _LVOSPCmp
XREF _LVOSPTieee
XREF _LVOSPFieee
XREF _LVOLoadRGB4
XREF _CXV45
XREF _CXV54
XDEF _F2I
XDEF _I2F
XDEF _Int32Mand_asm
XDEF _FloatMand_asm
XDEF _DoCycle_asm
XDEF _PaletteLeft
XDEF _PaletteRight
* Int32Mand_asm (long,long,LONG);
* A0 A1 D0
_Int32Mand_asm:
movem.l d2-d7/a2-a6,-(a7)
move.l d0,d3
moveq #0,d4 ; q1 = 0
moveq #0,d5 ; q2 = 0
moveq #0,d6 ; x = 0
moveq #0,d7 ; y = 0
subq.w #1,d3
mandelloop2:
move.l d6,d1 ; D1 = oldx;
move.l d4,d6
sub.l d5,d6
add.l a0,d6 ; x(D6) = q1(D4) - q2(D5) + acoo(A0);
move.l d1,d2
bpl.s Pos1
neg.l d1
Pos1:
eor.l d7,d2
tst.l d7
bpl.s Pos2
neg.l d7
Pos2:
move.l d1,d0
swap d0
move.w d0,d2
mulu d7,d0
clr.w d0
swap d0
swap d7
mulu d7,d1
clr.w d1
swap d1
mulu d2,d7
add.l d0,d7
add.l d1,d7
tst.l d2
bpl.s Pos3
neg.l d7
Pos3:
moveq #6,d0
asl.l d0,d7
add.l a1,d7 ; y(D7) = 2 * oldx(D1) * y(D7) + bcoo(A1);
moveq #5,d0
move.l d7,d5
bpl.s Pos4
neg.l d5
Pos4:
move.l d5,d2
swap d5
mulu d5,d2
clr.w d2
swap d2
mulu d5,d5
add.l d2,d5
add.l d2,d5
asl.l d0,d5 ; q2(D4) = y(D7)^2;
bvs.s mandelexit
move.l d6,d4
bpl.s Pos5
neg.l d4
Pos5:
move.l d4,d2
swap d4
mulu d4,d2
clr.w d2
swap d2
mulu d4,d4
add.l d2,d4
add.l d2,d4
asl.l d0,d4 ; q1(D4) = x(D6)^2;
bvs.s mandelexit
move.l d4,d0
add.l d5,d0
bvs.s mandelexit
cmp.l #536870912,d0
bgt.s mandelexit
dbf d3,mandelloop2
moveq #1,d3
mandelexit:
subq.w #1,d3
move.l d3,d0
movem.l (a7)+,d2-d7/a2-a6
rts
* LONG __asm FloatMand_asm (float,float,LONG);
* D0 A0 A1 D0
_FloatMand_asm:
movem.l d2-d7/a2-a6,-(a7) ; /* Calculate iteration of point */
move.l a0,_acoo
move.l a1,_bcoo
move.l d0,d3
move.l _MathBase(a4),a6
moveq #0,d4 ; q1
moveq #0,d5 ; q2
moveq #0,d6 ; x
moveq #0,d7 ; y
subq.w #1,d3
mandelloop:
move.l d4,d0
move.l d5,d1
jsr _LVOSPSub(a6) ; d0 = q1 - q2;
move.l _acoo(PC),d1
jsr _LVOSPAdd(a6)
move.l d6,d1 ; lastx = x
move.l d0,d6 ; x = q1 - q2 + a;
move.l d7,d0
jsr _LVOSPMul(a6) ; d0 = lastx * y;
addq.b #1,d0 ; move.l d0,d1
; jsr _LVOSPAdd(a6) ; d0 = 2 * lastx * y;
move.l _bcoo(PC),d1
jsr _LVOSPAdd(a6)
move.l d0,d7 ; y = 2 * lastx * y + b;
move.l d0,d1
jsr _LVOSPMul(a6) ; q2 = y * y;
move.l d0,d5
move.l d6,d0 ; d0 = x;
move.l d0,d1
jsr _LVOSPMul(a6) ; q1 = x * x;
move.l d0,d4
move.l d5,d1
jsr _LVOSPAdd(a6) ; d0 = q1 + q2;
move.l #$80000043,d1
jsr _LVOSPCmp(a6)
bgt.s leavemandel ; if (q1 + q2 > 4.0) goto leavemandel;
dbf d3,mandelloop
moveq #1,d3
leavemandel:
subq.w #1,d3
move.l d3,d0
movem.l (a7)+,d2-d7/a2-a6
rts
_acoo: dc.l 0
_bcoo: dc.l 0
* void DoCycle_asm
_DoCycle_asm:
Forever:
move.l _GfxBase(a4),a6
jsr _LVOWaitTOF(a6)
move.w _CycleOn(a4),d0
beq ExitCycle
CyclePalette:
move.w _CurrSpeed(a4),d0
subq.w #1,d0
bne.s NoCycle
tst.w _CycleLeft(a4)
beq.s CycleRight
bsr.s PaletteLeft
bra.s SetColors
CycleRight:
bsr.s PaletteRight
SetColors:
lea _Palette(a4),a1
move.l _Manvp(a4),a0
moveq #32,d0
move.l _GfxBase(a4),a6
jsr _LVOLoadRGB4(a6)
move.w _CycleSpeed(a4),d0
NoCycle:
move.w d0,_CurrSpeed(a4)
bra.s Forever
PaletteLeft:
lea _Palette(a4),a1
move.w 8(a1),d2
move.w #8,d3
moveq #26,d7
CycleLoop:
move.w 2(a1,d3.l),0(a1,d3.l)
addq.l #2,d3
dbf d7,CycleLoop
move.w d2,62(a1)
lea _toppos(a4),a1
moveq #2,d7
TopLeft:
move.w (a1),d0
subq.w #1,d0
cmp.w #3,d0
bne.s Ok2
moveq #31,d0
Ok2:
move.w d0,(a1)+
dbf d7,TopLeft
rts
PaletteRight:
lea _Palette(a4),a1
move.w 62(a1),d2
move.w #62,d3
moveq #26,d7
CycleLoop2:
move.w -2(a1,d3.l),0(a1,d3.l)
subq.l #2,d3
dbf d7,CycleLoop2
move.w d2,8(a1)
lea _toppos(a4),a1
moveq #2,d7
TopRight:
move.w (a1),d0
addq.w #1,d0
cmp.w #32,d0
bne.s Ok1
moveq #4,d0
Ok1:
move.w d0,(a1)+
dbf d7,TopRight
ExitCycle:
rts
_PaletteLeft:
movem.l d2/d3/d7/a1,-(a7)
jsr PaletteLeft
movem.l (a7)+,d2/d3/d7/a1
rts
_PaletteRight:
movem.l d2/d3/d7/a1,-(a7)
jsr PaletteRight
movem.l (a7)+,d2/d3/d7/a1
rts
* FFP-IEEE conversions *
* void F2I (ULONG *ieee,float getal)
* A0 D0
_F2I:
move.l a3,-(a7)
move.l a0,a3
movea.l _MathTransBase(a4),a6
jsr _LVOSPTieee(a6)
jsr _CXV45(PC) ; convert single ieee to double ieee
movem.l d0-d1,(a3)
movea.l (a7)+,a3
rts
* float I2F (ULONG *ieee)
* D0 A0
_I2F:
movem.l (a0),d0-d1
jsr _CXV54(PC) ; convert double ieee to single ieee
movea.l _MathTransBase(a4),a6
jsr _LVOSPFieee(a6)
rts
END